// ex8_8_6.cpp
#include <cstddef>
#include <iostream>
#include <cstring>
//template<class T>
//T maxn(T *arr, int n);

//template<class T>
//T* maxn<T *arr>(T arr[], int n);
//template<> char* maxn(const char *arr, int n);
//T* maxn(T arr[][30], int n);
//template <> const *char maxn<const char ptr[][5], int)>(const char(*ptr)[], int n);
template<class T>
T maxn(T *arr, int n)
{
    int idx_max = 0;
    for (int i = 0; i < n; i++)
    {
        if (arr[idx_max] < arr[i])
                idx_max = i;
    }
    return arr[idx_max];
}
/*****
template<> char * maxn<>(char *s[], int n)
{
    //char p_tmp[5][30] = {'\0'};
    //char (*ptr)[5][30] = {0};
    int idx = 0;
    //int max_size = strlen(s[idx]);

    for (int i = 1; i < n; i++)
    {
        if (strlen(s[idx]) < strlen(s[i]))
        {
            idx = i;
        }
    }
    return s[idx];
}*****/

int maxlen2(char *s)
{
    int idx = 0;
    char *p = s;
    int maxlen = 0;
    while (*p)
    {
        ++maxlen;
        p++;
    }
    return maxlen;
}

char * maxlen_compare(char s[][30], int n)
{
    int idx = 0, len = maxlen2(s[0]);;
    for (int i = 0; i < n; i++)
    {
        if (len < maxlen2(s[i]))
        {
            idx = i;
        }
    }
    return s[idx];
}

/*template<> char * maxn(char *s[], int n)
{
    //char p_tmp[5][30] = {'\0'}; 
    int idx = 0;
    //int max_size = strlen(s[idx]);

    for (int i = 1; i < n; i++)
    {
        if (strlen(s[idx]) < strlen(s[i]))
        {
            idx = i;
        }
    }
    return s[idx];
}
*/
int main(void)
{
    int arr[] = {2, 1, 3, 1009, 4, 32};
    double arr2[] = {1.3, 3.5, 9.2, 4.7};
    char arr3[5][30] = {"Hello", "World", "Anna", "Ben", "Cealission",};
    char (*ptr)[5][30] = {0};
    ptr = &arr3;
    char *p_temp;
    //(*ptr[0], arr3[0], strlen(arr3[0]));
    // char (*ptr)[5][30];
    // strcpy(*ptr[0], "Hello");
    // strcpy(*ptr[1], "World");
    // strcpy(*ptr[2], "Anna");
    // strcpy(*ptr[3], "Ben");
    // strcpy(*ptr[4], "Cealission");

    std::cout << maxn(arr, 6) << "\n";
    std::cout << maxn(arr2, 4) << "\n";
    //std::cout << maxn(*arr3, 5) << "\n";
    //std::cout << maxn(arr3[0], 5) << "\n";
    //std::cout << maxn(*arr3, 5) << "\n";
    //p_temp = maxn(*arr3, 5);
    //std::cout << p_temp << "\n";
    //std::cout << maxn(&ptr, 5) << "\n";
    std::cout << maxlen_compare(arr3, 5) << "\n";
    //std::cout << *(maxn(&ptr, 5)) << "\n";
    //ptr = maxn(&ptr, 5);
    //std::cout << *(ptr[0]) << "\n";
    //std::cout << maxn(ptr[0], 5) << "\n";
    return 0;
}
// template<class T>
// T maxn(T arr[], int n)
// {
//     const T *p = arr;
//     for (size_t i = 1; i < n; i++)
//     {
//         if (*p < arr[i])
//             p = &arr[i];
//     }
//     return *p;
// }
//template<class T>
//template<>
//const *char maxn<char*, int>(const char arr[][30], int n)
//template<class T>
//T* maxn(T arr[][30], int n)
// T* maxn(T (*arr)[5], int n)
// {
//     // T (*p)[5] = arr;
//     // std::cout << *p[0] << "\n";
//     // std::cout << *p[1] << "\n";
//     // std::cout << *p[2] << "\n";
//     // std::cout << *p[3] << "\n";
//     // std::cout << *p[4] << "\n";
//     T (*p)[5] = arr;
//     T *p_max = new T[30];
//     p_max= p[0];
//     for (int i = 1; i < n; i++)
//     {
//         if (strlen(*p_max) < strlen(*p[i]))
//         {
//             p_max = p[i];
//         }
//     }
//     std::cout << *p_max << "\n";
//     return p_max;
// }



/*template<>
char* maxn<>(char ptr[5], int n)
{
    // char *p_max = new char[5];
    // strncpy(p_max, ptr[0], strlen(ptr[0]));
    
    // for (int i = 1; i < n; i++)
    // {
    //     if (strcmp(p_max, ptr[i]))
    //         strncpy(p_max, ptr[i], strlen(ptr[i]));
    // }
    // return p_max;

    char **p_max = ptr;
    for (int i = 1; i < n; i++)
    {
        if (strcmp(*p_max, ptr[i]))
            //strncpy(*p_max, ptr[i], strlen(ptr[i]));
            p_max = &ptr[i];
    }
    return *p_max;

}*/
/*template<>
//char* maxn<>(char *ptr[5], int n)
char* maxn(T (*arr)[5], int n)
{
    char *p_max = new char[5];
    strncpy(p_max, ptr[0], strlen(ptr[0]));
    
    for (int i = 1; i < n; i++)
    {
        if (strcmp(p_max, ptr[i]))
            strncpy(p_max, ptr[i], strlen(ptr[i]));
    }
    return p_max;
}*/

//template<>
//T* maxn(T (*arr)[5], int n)
/*template<> char* maxn<>(const char *arr, int n)
{
    //char *p_max = new char[30]{0};
    char *p_max = new char[5];
    //strncpy(p_max, ptr[0], strlen(ptr[0]));
    
    p_max = arr;
    for (int i = 1; i < n; i++)
    {
        if (strlen(p_max) < strlen(arr+i))
        {   
            p_max = arr+i;
        }
    }
    std::cout << *p_max << "\n";
    return p_max;
}*/
/**
template<class T>
T maxn(T *arr, int n)
{
    int idx_max = 0;
    for (int i = 0; i < n; i++)
    {
        if (arr[idx_max] < arr[i])
                idx_max = i;
    }
    return arr[idx_max];
}
template<> char * maxn(char *s[], int n)
{
    //char p_tmp[5][30] = {'\0'}; 
    int idx = 0;
    //int max_size = strlen(s[idx]);

    for (int i = 1; i < n; i++)
    {
        if (strlen(s[idx]) < strlen(s[i]))
        {
            idx = i;
        }
    }
    return s[idx];
}
**/